#ifndef THREAD_H
#define	THREAD_H

#include <cstdlib>
#include <pthread.h>
#include <errno.h>
#include "Excepcion.h"

using namespace std;
using namespace TP;

namespace TP {    namespace Threading {
    class Thread {
        public:
            Thread();

            virtual ~Thread();

            int ID();

            virtual void Iniciar() throw (Excepcion&);

            virtual void Finalizar() throw (Excepcion&);

        protected:

            virtual void tarea() = 0;

            void Ocupar();

            void Liberar();

            bool Trabajando();

            void lock();

            void unlock();

        private:

            bool Activo();

            void Activar();

            void Desactivar();

            void* correr(void* pArgs);

            static void* correr_helper(void* contexto) {
                return ((Thread*) contexto)->correr(contexto);
            }

            pthread_t thread;
            bool activo;
            bool trabajando;
        };
    }
}

#endif	/* THREAD_H */

